package host.springboot.framework.mybatisplus.generate;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import host.springboot.framework.mybatisplus.exception.MybatisGenerateException;
import host.springboot.framework.mybatisplus.generate.config.CodeBasicConfig;
import host.springboot.framework.mybatisplus.generate.config.CodeDataSourceConfig;
import host.springboot.framework.mybatisplus.generate.config.CodePackageConfig;
import org.jspecify.annotations.NonNull;

/**
 * MybatisPlus代码生成器接口
 *
 * <p>默认提供了一个代码生成器接口实现, 见 {@link DefaultGenerateCodeServiceImpl}
 * <hr>
 * <p>使用示例:
 * <pre>{@code
 * MybatisGenerateCodeService generateCodeService = new DefaultGenerateCodeServiceImpl();
 * // 基础配置
 * CodeBasicConfig basicConfig = new CodeBasicConfig();
 * // 作者, 可为空, 默认为 ks-boot4j
 * basicConfig.setAuthor("ks-boot4j");
 * // 从xxx版本开始, 可为空, 默认为 ks-boot4j
 * basicConfig.setSince("1.0.0");
 * // 输出包类型, 可为空, 默认为 ALL
 * basicConfig.setOutputType(CodeBasicConfig.OutputType.ALL);
 * // 是否开启 springdoc 模式, 可为空, 默认为 false
 * basicConfig.setEnableSpringdoc(true);
 * // 数据源配置
 * CodeDataSourceConfig dataSourceConfig = new CodeDataSourceConfig();
 * // 驱动连接的URL, 不能为空
 * dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/krismile_framework?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true");
 * // 数据库连接用户名, 不能为空
 * dataSourceConfig.setUsername("root");
 * // 数据库连接密码, 不能为空
 * dataSourceConfig.setPassword("123456");
 * // 统一表前缀, 可为空
 * dataSourceConfig.setTablePrefix(null);
 * // 输出包含表, 可为空, 为空时则输出所有表
 * dataSourceConfig.setIncludeTables();
 * // 包配置
 * CodePackageConfig packageConfig = new CodePackageConfig();
 * // 输出包名, 不能为空
 * packageConfig.setOutputPackage("host.springboot.framework.main");
 * // 实体类包名, 可为空, 默认为 domain
 * packageConfig.setEntityPackageName("domain");
 * // 界面层包名, 可为空, 默认为 controller
 * packageConfig.setControllerPackageName("controller");
 * // 业务逻辑层包名, 可为空, 默认为 service
 * packageConfig.setServicePackageName("service");
 * // 业务逻辑实现层包名, 可为空, 默认为 service.impl
 * packageConfig.setServicePackageName("service.impl");
 * // 数据访问层包名, 可为空, 默认为 mapper
 * packageConfig.setMapperPackageName("mapper");
 * // 数据访问层XML包名, 可为空, 默认为 mapper/xml
 * packageConfig.setMapperXmlPackageName("mapper/xml");
 * FastAutoGenerator generator = generateCodeService.createGenerator(basicConfig, dataSourceConfig, packageConfig);
 * generator.execute();
 * }</pre>
 *
 * @author JiYinchuan
 * @since 1.0.0
 */
public interface MybatisGenerateCodeService {

    /**
     * 创建代码生成器
     *
     * @param basicConfig      基本配置
     * @param dataSourceConfig 数据源配置
     * @param packageConfig    包配置
     * @return 代码生成器
     * @throws MybatisGenerateException 代码生成异常
     * @see FastAutoGenerator#execute()
     * @since 1.0.0
     */
    @NonNull
    FastAutoGenerator createGenerator(
            @NonNull CodeBasicConfig basicConfig,
            @NonNull CodeDataSourceConfig dataSourceConfig,
            @NonNull CodePackageConfig packageConfig)
            throws MybatisGenerateException;

}
